using UnityEngine;
using QFramework;
using QFramework.Example;
using Unity.VisualScripting;
using System.Linq;
using QAssetBundle;

namespace ProjectSurvivor
{
	public partial class SimpleKnife : ViewController//小刀
	{
		private float mCurrentSeocnds = 0;
		void Update()
		{
			mCurrentSeocnds += Time.deltaTime;
			//如果当前秒数大于等于小刀持续时间
			if (mCurrentSeocnds >= Global.SimpleKnifeDuration.Value)
			{
				mCurrentSeocnds = 0;
				if (Player.Default)
				{
					//通过类型查找敌人()                            找到所有激活敌人
					var enemies = FindObjectsByType<Enemy>(FindObjectsInactive.Exclude, FindObjectsSortMode.None)
					//按照与玩家的位置距离排序，找到离玩家最近的敌人.从集合中返回符合条件的第一个元素。如果集合为空或没有符合条件的元素，它会返回集合类型的默认值
					//                升序排序。降序排序:OrderByDescending
					.OrderBy(enemy => Player.Default.Distance2D(enemy))
					//用于从序列的开头获取指定数量的元素。  刀数量+额外飞行物体数量
					//获取所有敌人然后发射小刀
					.Take(Global.SimpleKnifeCount.Value+Global.AdditionalFlyThingCount.Value);
					var i = 0;
					foreach (var enemy in enemies)
					{
						if (i < 4)
						{
							//延迟11帧播放音乐   //StartGlobal()是QFramework框架中的一个方法，用于启动全局系统
							ActionKit.DelayFrame(11*i,()=>{AudioKit.PlayMusic(Sfx.KNIFE);}).StartGlobal();
						}
						i++;
						if (enemy)
						{
							Knife.Instantiate()
							.Position(this.Position())
							.Show()
							.Self(self =>
							{
								//缓存小刀
								var selfCache = self;
								//获取敌人到玩家的方向
// 								计算从敌人到玩家的标准化方向向量
// 返回一个长度为1的单位向量
// 表示敌人指向玩家的方向
								var direction = enemy.NormalizedDirection2DFrom(Player.Default);
								//设置小刀的朝向
								self.transform.up = direction;
								var rigidbody2D = self.GetComponent<Rigidbody2D>();
								rigidbody2D.velocity = direction * 10;
								//攻击次数
								var attackCount=0;
								//触发器碰撞
								self.OnTriggerEnter2DEvent(collider =>
								{
									var hurtBox = collider.GetComponent<HurtBox>();
									if (hurtBox)
									{
										if (hurtBox.Owner.CompareTag("Enemy"))
										{
											//计算伤害次数
											var damageTimes=Global.SuperKnife.Value?Random.Range(2,3+1):1;
											//计算伤害
											DamageSystem.CalculateDamage(Global.SimpleKnifeDamage.Value*damageTimes,
									hurtBox.Owner.GetComponent<Enemy>());
											//攻击次数自增
											attackCount++;
											//如果攻击次数大于等于攻击次数
											if(attackCount>=Global.SimpleKnifeAttackCount.Value)
											{
												//销毁小刀
												selfCache.DestroyGameObjGracefully();
											}
										}
									}
								}).UnRegisterWhenGameObjectDestroyed(self);
								//每帧更新
								ActionKit.OnUpdate.Register(() =>
								{
									if (Player.Default)
									{
										// 如果刀与玩家的距离大于 20，销毁刀
										if (Player.Default.Distance2D(selfCache) > 20)
										{
											self.DestroyGameObjGracefully();
										}
									}
								}).UnRegisterWhenGameObjectDestroyed(self);
							});
						}
					}
					//按照与玩家的位置距离排序，找到离玩家最近的敌人                              从集合中返回符合条件的第一个元素。如果集合为空或没有符合条件的元素，它会返回集合类型的默认值
					//                升序排序。降序排序:OrderByDescending

					//.OrderBy(enemy => (Player.Default.transform.position - enemy.transform.position).magnitude).FirstOrDefault();


				}
			}
		}
	}
}
